/*
 * Copyright (c) 1994-2017, Joyoung Stock CO.LTD.
 * The FWJR Project.
 * All Rights Reserved.
 */

package jz.joyoung.robot.util;


import android.util.Log;

/**
 * Log统一管理类
 */
public class LogUtil {
    /**
     * isDebug: 是否需要打印bug，可以在application的onCreate函数里面初始化
     */
    public static boolean isDebug = true;

    private static final String DEFAULT_TAG = "LogUtil";

    // *********************************下面四个是默认tag的函数**********************************//
    public static void i(String msg) {
        if (isDebug) {
            Log.i(DEFAULT_TAG, msg);
        }
    }

    public static void d(String msg) {
        if (isDebug) {
            Log.d(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
        }
    }

    public static void e(String msg) {
        if (isDebug) {
            Log.e(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
        }
    }

    public static void v(String msg) {
        if (isDebug) {
            Log.v(DEFAULT_TAG, msg);
        }
    }

    public static void w(String msg) {
        if (isDebug) {
            Log.w(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
        }
    }

    // *********************************下面四个是默认tag的函数**********************************//
    public static void i(String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.i(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.i(DEFAULT_TAG, msg);
            }
        }
    }

    public static void d(String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.d(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.d(DEFAULT_TAG, msg);
            }
        }
    }

    public static void e(String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.e(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.e(DEFAULT_TAG, msg);
            }
        }
    }

    public static void v(String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.v(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.v(DEFAULT_TAG, msg);
            }
        }
    }

    public static void w(String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.w(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.w(DEFAULT_TAG, msg);
            }
        }
    }

    // *********************************下面是传入异常的函数*************************************//
    public static void i(String msg, Throwable tr) {
        if (isDebug) {
            Log.i(DEFAULT_TAG, msg, tr);
        }
    }

    public static void d(String msg, Throwable tr) {
        if (isDebug) {
            Log.d(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
        }
    }

    public static void e(String msg, Throwable tr) {
        if (isDebug) {
            Log.e(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
        }
    }

    public static void v(String msg, Throwable tr) {
        if (isDebug) {
            Log.v(DEFAULT_TAG, msg, tr);
        }
    }

    public static void w(String msg, Throwable tr) {
        if (isDebug) {
            Log.w(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
        }
    }

    // *********************************下面是传入异常的函数*************************************//
    public static void i(String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.i(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.i(DEFAULT_TAG, msg, tr);
            }
        }
    }

    public static void d(String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.d(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.d(DEFAULT_TAG, msg, tr);
            }
        }
    }

    public static void e(String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.e(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.e(DEFAULT_TAG, msg, tr);
            }
        }
    }

    public static void v(String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.v(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.v(DEFAULT_TAG, msg, tr);
            }
        }
    }

    public static void w(String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.w(DEFAULT_TAG, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.w(DEFAULT_TAG, msg, tr);
            }
        }
    }

    // *********************************下面是传入自定义tag的函数********************************//
    public static void i(String tag, String msg) {
        if (isDebug) {
            Log.i(tag, msg);
        }
    }

    public static void d(String tag, String msg) {
        if (isDebug) {
            Log.d(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
        }
    }

    public static void e(String tag, String msg) {
        if (isDebug) {
            Log.e(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
        }
    }

    public static void v(String tag, String msg) {
        if (isDebug) {
            Log.v(tag, msg);
        }
    }

    public static void w(String tag, String msg) {
        if (isDebug) {
            Log.w(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
        }
    }

    // *********************************下面是传入自定义tag的函数********************************//
    public static void i(String tag, String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.i(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.i(tag, msg);
            }
        }
    }

    public static void d(String tag, String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.d(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.d(tag, msg);
            }
        }
    }

    public static void e(String tag, String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.e(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.e(tag, msg);
            }
        }
    }

    public static void v(String tag, String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.v(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.v(tag, msg);
            }
        }
    }

    public static void w(String tag, String msg, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.w(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()));
            } else {
                Log.w(tag, msg);
            }
        }
    }

    // ****************************下面是传入自定义tag及异常的函数*******************************//
    public static void i(String tag, String msg, Throwable tr) {
        if (isDebug) {
            Log.i(tag, msg, tr);
        }
    }

    public static void d(String tag, String msg, Throwable tr) {
        if (isDebug) {
            Log.d(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
        }
    }

    public static void e(String tag, String msg, Throwable tr) {
        if (isDebug) {
            Log.e(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
        }
    }

    public static void v(String tag, String msg, Throwable tr) {
        if (isDebug) {
            Log.v(tag, msg, tr);
        }
    }

    public static void w(String tag, String msg, Throwable tr) {
        if (isDebug) {
            Log.w(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
        }
    }

    // ****************************下面是传入自定义tag及异常的函数*******************************//
    public static void i(String tag, String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.i(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.i(tag, msg, tr);
            }
        }
    }

    public static void d(String tag, String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.d(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.d(tag, msg, tr);
            }
        }
    }

    public static void e(String tag, String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.e(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.e(tag, msg, tr);
            }
        }
    }

    public static void v(String tag, String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.v(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.v(tag, msg, tr);
            }
        }
    }

    public static void w(String tag, String msg, Throwable tr, boolean isShowLineNo) {
        if (isDebug) {
            if (isShowLineNo) {
                Log.w(tag, msg + buildStackTraceElements(Thread.currentThread().getStackTrace()), tr);
            } else {
                Log.w(tag, msg, tr);
            }
        }
    }

    // ******************************************************************************************//

    /**
     * 获取当前代码所在类、方法、行数
     *
     * @return 返回当前线程栈信息
     */
    private static String buildStackTraceElements(StackTraceElement[] elements) {
        StringBuilder sb = new StringBuilder();
        sb.append("  \t===> ");
        if (elements.length < 4) {
            Log.e(DEFAULT_TAG, "Stack to shallow");
        } else {
            String fullClassName = elements[3].getClassName();
            sb.append(fullClassName.substring(fullClassName.lastIndexOf(".") + 1)).append(".").append(elements[3].getMethodName()).append("(...)").append(" [line ").append(elements[3].getLineNumber()).append("]");
        }
        return sb.toString();
    }

//    private static String getClassName(StackTraceElement[] elements) {
//        if (elements.length < 4) {
//            Log.e(DEFAULT_TAG, "Stack to shallow");
//            return DEFAULT_TAG;
//        } else {
//            String fullClassName = elements[3].getClassName();
//            return fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
//        }
//    }

}